const { log } = console;
// log(Object.is(+0, -0)); // false
// log(Object.is(NaN, NaN, 1)); // true
// log(Object.is("1", 1)); // false
// log(Object.is(0, false, 3)); // false
// log(Object.is(1)); //
// log(1 / -0);

// 总结: Object.is 静态方法是用来判断两个值是否是同一个值，
// 它在使用 === 严格判断的基础上，对 +0 和 -0、NaN判断做了不同的判断
// 对于 +0 和 -0 判断为 false， 对 NaN 和自己比较的时候判断为 true,  对 0 和 +0 判断为 true
// 对不支持此特性的 es 版本， 可以使用 Polyfill

Object.is =
  typeof Object.is === "function"
    ? Object.is
    : function (x, y) {
        if (arguments.length === 0) return true;
        if (arguments.length === 1) return false;

        // 首先使用 === 判断两个值是否一样
        // 如果一样 在 x 不等于 0 的情况下(即: x不是 0、+0、-0)， 两个值就是一样
        // 如果是x是 0、+0、-0的情况下，用 1 去分别除以两个值然后判断两个值是否一样
        // 使用 1 除以 0 或 +0， 会得到 Infinity, 除以一个 -0 会得到 -Infinity
        // 如果使用 === 判断两个值是不一样得，那么是 true 得唯一可能性就是 两个值都是 NaN
        // 所以使用 x !==x && y !== y,因为只有 NaN 才不等于 NaN
        if (x === y) {
          return x !== 0 || 1 / x === 1 / y;
        } else {
          return x !== x && y !== y;
        }
      };

// test:
log(Object.is("foo", "foo")); // true
log(Object.is([], [])); // false
log(Object.is("foo", "bar")); // false

const foo = { a: 1 };
const bar = { a: 1 };
log(Object.is(foo, foo)); // true
log(Object.is(foo, bar)); // false
log(Object.is(null, null)); // true
log(Object.is(0, -0)); // false
log(Object.is(0, +0)); // true
log(Object.is(-0, -0)); // true
log(Object.is(NaN, 0 / 0)); // true

// 参考资料: https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/is
